Package com.python.pydev.analysis.scopeanalysis

Source Code of com.python.pydev.analysis.scopeanalysis.AttributeReferencesVisitor

/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.python.pydev.analysis.scopeanalysis;

import java.util.Iterator;
import java.util.List;

import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.jython.ast.Attribute;
import org.python.pydev.parser.jython.ast.ClassDef;
import org.python.pydev.parser.jython.ast.FunctionDef;
import org.python.pydev.parser.jython.ast.Name;
import org.python.pydev.parser.jython.ast.NameTok;
import org.python.pydev.parser.visitors.NodeUtils;
import org.python.pydev.parser.visitors.scope.EasyAstIteratorBase;

/**
* This class will be able to check for the names of the attribute and return those entries.
* It will not check for attributes that start with 'self'.
*/
public class AttributeReferencesVisitor extends EasyAstIteratorBase {

    public static int ACCEPT_FUNCTION = 1;
    public static int ACCEPT_IN_CLASS_DECL = 2;

    public static int ACCEPT_ALL = ACCEPT_FUNCTION | ACCEPT_IN_CLASS_DECL;

    private int accept;

    public AttributeReferencesVisitor(int accept) {
        this.accept = accept;
    }

    private int inAttr = 0;

    protected Object unhandled_node(SimpleNode node) throws Exception {
        //System.out.println("unhandled_node:"+node);
        if (inAttr > 0 || (accept & ACCEPT_IN_CLASS_DECL) != 0 && isInClassDecl()) {
            if (node instanceof Name || (node instanceof NameTok && ((NameTok) node).ctx != NameTok.ClassName)) {
                atomic(node);
            }
        }

        return super.unhandled_node(node);
    }

    @Override
    public Object visitAttribute(Attribute node) throws Exception {
        //we don't want to visit the 1st part (only the others)
        List<SimpleNode> attributeParts = NodeUtils.getAttributeParts(node);
        Iterator<SimpleNode> it = attributeParts.iterator();
        SimpleNode firstPart = it.next();
        firstPart.accept(this);

        Object ret = null;
        inAttr += 1;
        try {
            while (it.hasNext()) {
                it.next().accept(this);
            }

        } finally {
            inAttr -= 1;
        }
        return ret;
    }

    @Override
    public Object visitFunctionDef(FunctionDef node) throws Exception {
        if ((accept & ACCEPT_FUNCTION) != 0) {
            atomic(node.name);
        }
        return super.visitFunctionDef(node);
    }

    @Override
    public Object visitClassDef(ClassDef node) throws Exception {
        //        atomic(node.name);
        return super.visitClassDef(node);
    }

    /**
     * Creates the iterator and transverses the passed root so that the results can be gotten.
     */
    public static AttributeReferencesVisitor create(SimpleNode root, int accept) {
        AttributeReferencesVisitor visitor = new AttributeReferencesVisitor(accept);
        try {
            root.accept(visitor);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return visitor;
    }

}
TOP

Related Classes of com.python.pydev.analysis.scopeanalysis.AttributeReferencesVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.